package com.limf.demo.java8;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

public class StreamTest {

	public static void main(String[] args) {
		List<String> stringCollection = new ArrayList<>();
		stringCollection.add("ddd2");
		stringCollection.add("aaa2");
		stringCollection.add("bbb1");
		stringCollection.add("aaa1");
		stringCollection.add("bbb3");
		stringCollection.add("ccc");
		stringCollection.add("ddd1");
		test(stringCollection);
		matchTest(stringCollection);
		countTest(stringCollection);
		reduceTest(stringCollection);
		paralelStreamTest();
	}
	static void test(List<String> stringCollection) {
		
		stringCollection.stream()
			.filter(s->s.startsWith("d"))
			.forEach(System.out::println);
		System.out.println("排序-------------------------------");
		stringCollection.stream().sorted()
			.filter(s->s.startsWith("a"))
			.forEach(System.out::println);
		System.out.println("原始数据-------------------------------");
		System.out.println(stringCollection);
		System.out.println("转换为大写-------------------------------");
		stringCollection.stream()
			.map(String::toUpperCase)
			.sorted((a, b)->b.compareTo(a))
			.forEach(System.out::println);

	}

	static void matchTest(List<String> stringCollection) {
		boolean anyStartsWithA = stringCollection
				.stream().anyMatch((s)->s.startsWith("a"));
		System.out.println(anyStartsWithA);    // true
		boolean allStartsWithA = stringCollection
				.stream().allMatch((s)->s.startsWith("a"));
		System.out.println(allStartsWithA);    // false
		boolean noneStartsWithA = stringCollection
				.stream().noneMatch((s)->s.startsWith("z"));
		System.out.println(noneStartsWithA);    // true
		
	}
	static void countTest(List<String> stringCollection) {
		long startsWithB = stringCollection.stream()
				.filter(s->s.startsWith("b"))
				.count();
		System.out.println(startsWithB);
	}
	static void reduceTest(List<String> stringCollection) {
		Optional<String> reduced = stringCollection
				.stream().sorted().reduce((s1, s2)->s1+"#"+s2);
		reduced.ifPresent(System.out::println);
	}
	
	static void paralelStreamTest() {
		int max = 100_0000;
		List<String> values = new ArrayList<>();
		for(int i=0;i<max;i++) {
			UUID uuid = UUID.randomUUID();
			values.add(uuid.toString());
		}
		// -- 串行
		long t0 = System.nanoTime();
		long count = values.stream().sorted().count();
		System.out.println(count);
		long t1 = System.nanoTime();
		long millis = TimeUnit.NANOSECONDS.toMillis(t1-t0);
		System.out.println(String.format("sequential sort took:%d ms", millis));
		
		// -- 并行
		long t20 = System.nanoTime();
		long count2 = values.parallelStream().sorted().count();
		System.out.println(count2);
		long t21 = System.nanoTime();
		long millis2 = TimeUnit.NANOSECONDS.toMillis(t21-t20);
		System.out.println(String.format("sequential sort took:%d ms",
				millis2));
		
	}
}
